---
title: AG-UI Overview
description: 
---

# The Agent–User Interaction (AG-UI) Protocol


AG-UI is an <u><strong>open</strong></u>, <u><strong>lightweight</strong></u>, <u><strong>event-based</strong></u> protocol that standardizes how AI agents connect to user-facing applications.


Built for simplicity and flexibility, it standardizes how agent state, UI intents, and user interactions flow between your model/agent runtime and user-facing frontend applications—to allow application developers to ship reliable, debuggable, user‑friendly agentic features fast while focusing on application needs and avoiding complex ad-hoc wiring.



<div style={{textAlign: 'center', margin: '2rem 0'}}>
  <img className="block dark:hidden" src="/images/ag-ui-overview-with-partners.png" alt="AG-UI Overview" style={{maxWidth: '100%', height: 'auto', borderRadius: '8px'}} />
  <img className="hidden dark:block" src="/images/ag-ui-overview-with-partners-dark.png" alt="AG-UI Overview" style={{maxWidth: '100%', height: 'auto', borderRadius: '8px'}} />
</div>

---

## Building blocks (today & upcoming)

<div style={{display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: '1rem', margin: '1.5rem 0'}}>
  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Streaming chat
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Live token and event streaming for responsive multi turn sessions, with cancel and resume.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Multimodality
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Typed attachments and real time media (files, images, audio, transcripts); supports voice, previews, annotations, provenance.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Generative UI, static
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Render model output as stable, typed components under app control.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Generative UI, declarative
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Small declarative language for constrained yet open-ended agent UIs; agents propose trees and constraints, the app validates and mounts.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Shared state
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        (Read-only & read-write). Typed store shared between agent and app, with streamed event-sourced diffs and conflict resolution for snappy collaboration.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Thinking steps
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Visualize intermediate reasoning from traces and tool events; no raw chain of thought.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Frontend tool calls
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Typed handoffs from agent to frontend-executed actions, and back.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Backend tool rendering
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Visualize backend tool outputs in app and chat, emit side effects as first-class events.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Interrupts (human in the loop)
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Pause, approve, edit, retry, or escalate mid flow without losing state.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Sub-agents and composition
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Nested delegation with scoped state, tracing, and cancellation.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Agent steering
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Dynamically redirect agent execution with real-time user input to guide behavior and outcomes.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Tool output streaming
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Stream tool results and logs so UIs can render long-running effects in real time.
      </div>
    </div>
  </div>

  <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden transition-all duration-300 cursor-pointer hover:border-blue-500 hover:shadow-lg" onMouseEnter={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '200px'; e.currentTarget.querySelector('.content').style.opacity = '1'; }} onMouseLeave={(e) => { e.currentTarget.querySelector('.content').style.maxHeight = '0px'; e.currentTarget.querySelector('.content').style.opacity = '0'; }}>
    <div className="px-6 py-4 bg-gray-50 dark:bg-gray-800 font-semibold text-gray-700 dark:text-gray-200">
      Custom events
    </div>
    <div className="content bg-white dark:bg-gray-900 px-6" style={{maxHeight: '0px', opacity: '0', overflow: 'hidden', transition: 'all 0.3s ease'}}>
      <div className="py-4 text-gray-600 dark:text-gray-400" style={{lineHeight: '1.6'}}>
        Open-ended data exchange for needs not covered by the protocol.
      </div>
    </div>
  </div>
</div>



---

## Why Agentic Apps need AG-UI

Agentic applications break the simple request/response model that dominated frontend-backend development in the pre-agentic era: a client makes a request, the server returns data, the client renders it, and the interaction ends.

#### The requirements of user‑facing agents

While agents are just software, they exhibit characteristics that make them challenging to serve behind traditional REST/GraphQL APIs:

- Agents are **long‑running** and **stream** intermediate work—often across multi‑turn sessions.
- Agents are **nondeterministic** and can **control application UI nondeterministically**.
- Agents simultanously mix **structured + unstructured IO** (e.g. text & voice, alongside tool calls and state updates).
- Agents need user-interactive **composition**: e.g. they may call sub‑agents, often recursively.
- And more...

AG-UI is an event-based protocol that enables dynamic communication between agentic frontends and backends. It builds on top of the foundational protocols of the web (HTTP, WebSockets) as an abstraction layer designed for the agentic age—bridging the gap between traditional client-server architectures and the dynamic, stateful nature of AI agents.

## The AI protocol landscape

AG-UI has emerged as the 3rd leg of the AI protocol landscape:
<div style={{textAlign: 'center', margin: '2rem 0'}}>
  <img src="/images/ai-protocol-stack.png" alt="AI Protocol Stack" style={{maxWidth: '40%', height: 'auto', borderRadius: '8px'}} />
</div>

- MCP: Connects agents to tool and to context.
- A2A: Connects agents to other agents.
- **AG-UI:** Connects agents to users (through user-facing applications)


These protocols are complimentary and have distinct technical goals; a single agent can and often does use all 3 simultanously.
Where these protocols intersect, there are opportunities for seamless handshakes facilitating interoperability—work on these integration points is actively ongoing.
AG-UI's mandate is to support the full set of building blocks required by modern agentic applications.




---

## AG-UI in action

<div style={{textAlign: 'center', margin: '3rem 0 1rem 0'}}>
  <video 
    width="100%" 
    height="auto" 
    autoPlay 
    muted 
    loop 
    controls 
    style={{maxWidth: '800px', borderRadius: '12px', boxShadow: '0 8px 32px rgba(0, 0, 0, 0.12)'}}
  >
    <source src="/videos/Dojo-overview.mp4" type="video/mp4" />
    Your browser does not support the video tag.
  </video>
</div>

<Callout type="info" icon="lightbulb">
You can see demo apps of the AG-UI features with the framework of your choice, with preview, code, and walkthrough docs in the [AG-UI Dojo](https://dojo.ag-ui.com/)
</Callout>

---

## Supported Integrations

AG-UI was born from CopilotKit's initial **partnership** with LangGraph and CrewAI - and brings the incredibly popular agent-user-interactivity infrastructure to the wider agentic ecosystem.

**1st party** = the platforms that have AG‑UI built in and provide documentation for guidance.

#### Direct to LLM

| Framework | Status | AG-UI Resources |
| :-------- | ------ | --------------- |
| Direct to LLM | Supported | [Docs](https://docs.copilotkit.ai/direct-to-llm) |

#### Agent Framework - Partnerships
| Framework | Status | AG-UI Resources |
| :-------- | ------ | --------------- |
| [LangGraph](https://www.langchain.com/langgraph) | Supported | [Docs](https://docs.copilotkit.ai/langgraph/), [Demos](https://dojo.ag-ui.com/langgraph-fastapi/feature/shared_state) |
| [CrewAI](https://crewai.com/) | Supported | [Docs](https://docs.copilotkit.ai/crewai-flows), [Demos](https://dojo.ag-ui.com/crewai/feature/shared_state) |

#### Agent Framework - 1st Party
| Framework | Status | AG-UI Resources |
| :-------- | ------ | --------------- |
| [Microsoft Agent Framework](https://azure.microsoft.com/en-us/blog/introducing-microsoft-agent-framework/) | Supported | [Docs](https://docs.copilotkit.ai/microsoft-agent-framework), [Demos](https://dojo.ag-ui.com/microsoft-agent-framework-dotnet/feature/shared_state) |
| [Google ADK](https://google.github.io/adk-docs/get-started/) | Supported | [Docs](https://docs.copilotkit.ai/adk), [Demos](https://dojo.ag-ui.com/adk-middleware/feature/shared_state?openCopilot=true) |
| [Mastra](https://mastra.ai/) | Supported | [Docs](https://docs.copilotkit.ai/mastra/), [Demos](https://dojo.ag-ui.com/mastra/feature/tool_based_generative_ui) |
| [Pydantic AI](https://github.com/pydantic/pydantic-ai) | Supported | [Docs](https://docs.copilotkit.ai/pydantic-ai/), [Demos](https://dojo.ag-ui.com/pydantic-ai/feature/shared_state) |
| [Agno](https://github.com/agno-agi/agno) | Supported | [Docs](https://docs.copilotkit.ai/agno/), [Demos](https://dojo.ag-ui.com/agno/feature/tool_based_generative_ui) |
| [LlamaIndex](https://github.com/run-llama/llama_index) | Supported | [Docs](https://docs.copilotkit.ai/llamaindex/), [Demos](https://dojo.ag-ui.com/llamaindex/feature/shared_state) |
| [AG2](https://ag2.ai/) | Supported | [Docs](https://docs.copilotkit.ai/ag2/) |
| [AWS Bedrock Agents](https://aws.amazon.com/bedrock/agents/) | In Progress | – |
| [AWS Strands Agents](https://github.com/strands-agents/sdk-python) | In Progress | – |

#### Agent Framework - Community
| Framework | Status | AG-UI Resources |
| :-------- | ------ | --------------- |
| [Vercel AI SDK](https://github.com/vercel/ai) | Supported | [Docs](https://github.com/ag-ui-protocol/ag-ui/tree/main/integrations/vercel-ai-sdk/typescript) |
| [OpenAI Agent SDK](https://openai.github.io/openai-agents-python/) | In Progress | – |
| [Cloudflare Agents](https://developers.cloudflare.com/agents/) | In Progress | – |

### Agent Interaction Protocols

| Protocol | Status | AG-UI Resources | Integrations |
| :------- | ------ | --------------- | ------------ |
| [A2A Middleware](https://a2a.org/) | Supported | [Docs](https://docs.copilotkit.ai/a2a-protocol) | Partnership |

### SDKs

| SDK | Status | AG-UI Resources | Integrations |
| :-- | ------- | ---------------- | ------------- |
| [Kotlin]() | Supported | [Getting Started](https://github.com/ag-ui-protocol/ag-ui/blob/main/docs/sdk/kotlin/overview.mdx) | Community |
| [Golang]() | Supported | [Getting Started](https://github.com/ag-ui-protocol/ag-ui/blob/main/docs/sdk/go/overview.mdx) | Community |
| [Dart]() | Supported | [Getting Started](https://github.com/ag-ui-protocol/ag-ui/tree/main/sdks/community/dart) | Community |
| [Java]() | Supported | [Getting Started](https://github.com/ag-ui-protocol/ag-ui/blob/main/docs/sdk/java/overview.mdx) | Community |
| [Rust]() | Supported | [Getting Started](https://github.com/ag-ui-protocol/ag-ui/tree/main/sdks/community/rust/crates/ag-ui-client) | Community |
| [.NET]() | In Progress | [PR](https://github.com/ag-ui-protocol/ag-ui/pull/38) | Community |
| [Nim]() | In Progress | [PR](https://github.com/ag-ui-protocol/ag-ui/pull/29) | Community |
| [Flowise]() | In Progress | [GitHub Source](https://github.com/ag-ui-protocol/ag-ui/issues/367) | Community |
| [Langflow]() | In Progress | [GitHub Source](https://github.com/ag-ui-protocol/ag-ui/issues/366) | Community |

### Clients

| Client | Status | AG-UI Resources | Integrations |
| :----- | ------ | --------------- | ------------ |
| [CopilotKit](https://github.com/CopilotKit/CopilotKit) | Supported | [Getting Started](https://docs.copilotkit.ai/direct-to-llm/guides/quickstart) | 1st Party |
| [Terminal + Agent]() | Supported | [Getting Started](https://docs.ag-ui.com/quickstart/clients) | Community |
| [React Native](https://reactnative.dev/) | Help Wanted | [GitHub Source](https://github.com/ag-ui-protocol/ag-ui/issues/510) | Community |

---

## Quick Start

Choose the path that fits your needs:

<CardGroup cols={3}>
  <Card
    title="Build agentic applications"
    icon="rocket"
    href="/quickstart/applications"
    color="#3B82F6"
    iconType="solid"
  >
    Build agentic applications powered by AG-UI compatible agents.
  </Card>

  <Card
    title="Build new AG-UI integrations"
    icon="plug"
    href="/quickstart/introduction"
    color="#3B82F6"
    iconType="solid"
  >
    Build integrations for new agent frameworks, custom in-house solutions, or use AG-UI without any agent framework.
  </Card>

  <Card
    title="Build AG-UI compatible clients"
    icon="desktop"
    href="/quickstart/clients"
    color="#3B82F6"
    iconType="solid"
  >
    Build new clients for AG-UI-compatible agents (web, mobile, slack, messaging, etc.)
  </Card>

</CardGroup>

## Explore AG-UI

Dive deeper into AG-UI's core concepts and capabilities:

<CardGroup cols={2}>
  <Card
    title="Core architecture"
    icon="sitemap"
    iconType="light"
    color="#3B82F6"
    href="/concepts/architecture"
  >
    Understand how AG-UI connects agents, protocols, and front-ends
  </Card>

  <Card
    title="Events"
    icon="bolt"
    iconType="light"
    color="#3B82F6"
    href="/concepts/events"
  >
    Learn about AG-UI's event-driven protocol
  </Card>
</CardGroup>

## Resources

Explore guides, tools, and integrations to help you build, optimize, and extend
your AG-UI implementation. These resources cover everything from practical
development workflows to debugging techniques.

<CardGroup cols={2}>
  <Card
    title="Developing with Cursor"
    icon="rocket"
    iconType="light"
    color="#3B82F6"
    href="/tutorials/cursor"
  >
    Use Cursor to build AG-UI implementations faster
  </Card>
  <Card
    title="Troubleshooting AG-UI"
    icon="bug"
    iconType="light"
    color="#3B82F6"
    href="/tutorials/debugging"
  >
    Fix common issues when working with AG-UI servers and clients
  </Card>
</CardGroup>


## Contributing

Want to contribute? Check out our
[Contributing Guide](/development/contributing) to learn how you can help
improve AG-UI.

## Support and Feedback

Here's how to get help or provide feedback:

- For bug reports and feature requests related to the AG-UI specification, SDKs,
  or documentation (open source), please
  [create a GitHub issue](https://github.com/ag-ui-protocol/ag-ui/issues)
- For discussions or Q&A about AG-UI, please join the [Discord community](https://discord.gg/Jd3FzfdJa8)
